package basic.string;

import java.time.LocalDate;
import java.time.LocalDateTime;

/**
 * @author Cheng Jun
 * @version 1.0 Description: a 97， A 65
 * @date 2019/10/18 10:18
 */
public class StringStudy {
  public static void main(String[] args) {
    String name = "cauchy";
    String[] split = "aa a".split("aa");
    String[] split1 = "aa a".split(" a");
    char[] chars = name.toCharArray();
    String newName = new String(chars);
    System.out.println(name == newName);
    System.out.println(name.equals(newName));

    // name.subString(x, y) 截取 name 的 [x, y)
    // [0, 0) 输出空字符串 ""
    System.out.println(name.substring(0, 0));
    for (int i = 0; i < 100; i++) {
      name += "i";
    }
    System.out.println(name);

    final Integer number = 198;
    // number = 2;
    final String firstName = "Cheng";
    // firstName = "cheng";
    // 00023
    String format = String.format("%0" + 5 + "d", 23);
    System.out.println(format);

    // hashCode 相同，但是 equals 不相等。
    String Ma = "Ma";
    String NB = "NB";
    System.out.println(Ma.hashCode());
    System.out.println(NB.hashCode());

    String s1 = "abc";
    String s2 = "ca";
    System.out.println(s1.charAt(0));
    System.out.println(s2.indexOf(s1.charAt(0)));
    System.out.println(s2.indexOf(s1.charAt(0), 2));

    String test = "01234";
    StringBuilder sb = new StringBuilder(test);
    System.out.println(sb.deleteCharAt(0));
    System.out.println(sb.deleteCharAt(1));

    // intern /ɪnˈtɜːn/ 扣押 拘留
    // 看源码注释，就是将 abc放到常量池中，返回常量池中的引用，如果常量池中有了，就直接返回常量池中的引用
    String internTest = new String("abc");
    String internTest1 = new String("abc");
    System.out.println(internTest == internTest1);
    System.out.println(internTest.intern() == internTest1.intern());

    // 注意任何字符串 indexOf("") 都是返回 0
    System.out.println(internTest.indexOf("a"));
    System.out.println(internTest.indexOf(""));
    String a1 = "java";
    String a2 = "ja";
    String a3 = "va";
    // 在java里，+号 被重载了，其实是调用 java.lang.StringBuilder.append() 系列方法
    String a4 = a2 + a3;
    System.out.println(a1 == a4);

    System.out.println("432".compareTo("43243"));
    
    String nameStr = "cauchy";
    // 因为string 有常量池，所有两个线程中的 nameStr + 1 在内存中是同一个。
    // 这也是为什么 不使用 String lock = "" 去创建被锁的对象，而使用 Object lock = new Object();
    // 利用string有常量池的特性，在分布式系统中，如果仅是查询数据，可以使用jvm层面的锁，
    // 这样带来的好处是将打到DB的查询降低到常数量级别（集群数量），同时，实现起来简单。分布式锁能降到1，但实现起来麻烦
    new Thread(() -> System.out.println((nameStr + 1).hashCode())).start();
    new Thread(() -> System.out.println((nameStr + 1).hashCode())).start();

  }
}
